{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三步：细调调整树的参数：max_depth & min_child_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "X_train = train.drop([\"interest_level\"], axis=1)\n",
    "X_train = np.array(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（219），其余参数继续默认值\n",
    "上一轮参数调整得到的'max_depth': 5, 'min_child_weight': 1，在这里进行细调节"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [0.5, 1, 1.5]}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_depth = [4,5,6]\n",
    "min_child_weight = [0.5,1,1.5]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59342, std: 0.00334, params: {'max_depth': 4, 'min_child_weight': 0.5},\n",
       "  mean: -0.59336, std: 0.00317, params: {'max_depth': 4, 'min_child_weight': 1},\n",
       "  mean: -0.59393, std: 0.00362, params: {'max_depth': 4, 'min_child_weight': 1.5},\n",
       "  mean: -0.58928, std: 0.00408, params: {'max_depth': 5, 'min_child_weight': 0.5},\n",
       "  mean: -0.58876, std: 0.00418, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58917, std: 0.00425, params: {'max_depth': 5, 'min_child_weight': 1.5},\n",
       "  mean: -0.58922, std: 0.00361, params: {'max_depth': 6, 'min_child_weight': 0.5},\n",
       "  mean: -0.58936, std: 0.00340, params: {'max_depth': 6, 'min_child_weight': 1},\n",
       "  mean: -0.58889, std: 0.00381, params: {'max_depth': 6, 'min_child_weight': 1.5}],\n",
       " {'max_depth': 5, 'min_child_weight': 1},\n",
       " -0.5887620837531603)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=219,  #第一轮参数调整得到的n_estimators最优值\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=4, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_,     gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 274.07880597,  263.85701838,  267.40278106,  302.58745317,\n",
       "         302.00524831,  303.54043965,  346.14000783,  355.75152388,\n",
       "         323.33071761]),\n",
       " 'mean_score_time': array([ 0.6640964 ,  0.66570044,  0.66169128,  0.80744076,  0.82067299,\n",
       "         0.78408494,  1.07017841,  0.98837633,  0.85712848]),\n",
       " 'mean_test_score': array([-0.59341847, -0.59335921, -0.59393312, -0.58927755, -0.58876208,\n",
       "        -0.58916944, -0.58922418, -0.58936275, -0.58888548]),\n",
       " 'mean_train_score': array([-0.54937886, -0.54996551, -0.55079872, -0.51208093, -0.51338803,\n",
       "        -0.51531705, -0.46402847, -0.46703564, -0.47048209]),\n",
       " 'param_max_depth': masked_array(data = [4 4 4 5 5 5 6 6 6],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_min_child_weight': masked_array(data = [0.5 1 1.5 0.5 1 1.5 0.5 1 1.5],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 0.5},\n",
       "  {'max_depth': 4, 'min_child_weight': 1},\n",
       "  {'max_depth': 4, 'min_child_weight': 1.5},\n",
       "  {'max_depth': 5, 'min_child_weight': 0.5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 1.5},\n",
       "  {'max_depth': 6, 'min_child_weight': 0.5},\n",
       "  {'max_depth': 6, 'min_child_weight': 1},\n",
       "  {'max_depth': 6, 'min_child_weight': 1.5}],\n",
       " 'rank_test_score': array([8, 7, 9, 5, 1, 3, 4, 6, 2]),\n",
       " 'split0_test_score': array([-0.58780509, -0.58756265, -0.58767709, -0.58274125, -0.58164061,\n",
       "        -0.58264751, -0.5827374 , -0.58324898, -0.58279067]),\n",
       " 'split0_train_score': array([-0.55158826, -0.55202564, -0.55231686, -0.51380374, -0.5146005 ,\n",
       "        -0.51783627, -0.46417406, -0.46672137, -0.47064804]),\n",
       " 'split1_test_score': array([-0.59266726, -0.59348132, -0.59315917, -0.58737787, -0.58687398,\n",
       "        -0.5867198 , -0.58875776, -0.59072817, -0.58731996]),\n",
       " 'split1_train_score': array([-0.54909552, -0.55026426, -0.55125248, -0.51182202, -0.51360895,\n",
       "        -0.51593654, -0.46363255, -0.46719345, -0.47022746]),\n",
       " 'split2_test_score': array([-0.59306515, -0.59345623, -0.59391419, -0.58918546, -0.58986775,\n",
       "        -0.58911111, -0.59049362, -0.58930141, -0.59123903]),\n",
       " 'split2_train_score': array([-0.54924092, -0.54978611, -0.55042348, -0.51237954, -0.51342309,\n",
       "        -0.51487827, -0.46426129, -0.46756419, -0.47115077]),\n",
       " 'split3_test_score': array([-0.59742643, -0.59687039, -0.59808996, -0.59312065, -0.5922439 ,\n",
       "        -0.59302635, -0.59044723, -0.58988941, -0.58894611]),\n",
       " 'split3_train_score': array([-0.54858872, -0.5488195 , -0.55047444, -0.51225492, -0.51396996,\n",
       "        -0.51534805, -0.4639109 , -0.46661702, -0.470336  ]),\n",
       " 'split4_test_score': array([-0.59612923, -0.59542608, -0.5968261 , -0.59396393, -0.59318552,\n",
       "        -0.59434399, -0.59368626, -0.5936471 , -0.59413324]),\n",
       " 'split4_train_score': array([-0.54838085, -0.54893205, -0.54952635, -0.51014441, -0.51133766,\n",
       "        -0.51258613, -0.46416354, -0.46708214, -0.47004819]),\n",
       " 'std_fit_time': array([ 10.32159131,   6.59773515,   3.25944848,   4.31018636,\n",
       "          5.87789196,   9.9025143 ,   6.66202512,  11.01059159,  38.22355177]),\n",
       " 'std_score_time': array([ 0.04778784,  0.06445048,  0.04554392,  0.03907848,  0.07832681,\n",
       "         0.0808039 ,  0.22011907,  0.0646748 ,  0.1743819 ]),\n",
       " 'std_test_score': array([ 0.00333503,  0.00316943,  0.00361628,  0.00407604,  0.00417593,\n",
       "         0.00424709,  0.00361417,  0.00340227,  0.00381249]),\n",
       " 'std_train_score': array([ 0.00114901,  0.00116163,  0.00093547,  0.00117513,  0.00110116,\n",
       "         0.00169597,  0.00022988,  0.00034072,  0.00038707])}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.588762 using {'max_depth': 5, 'min_child_weight': 1}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "f:\\Anaconda2\\envs\\python3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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ES5Rn0yaieJhf8dHgX9w9x+b2eaclUhEpoxvPfQKW3cfHtF9Lps3jRs+9K5B16mvr2fVqlWcffbZPPPMM5x88slcccUV3HDDDbz99tvcfffdAHz5y1+mra2N4uJi7rzzTt75znfygx/8gJdffpk77riDl156icsuu4xnn32WkpKSfsdpbm7msssuo6mpidNPP53gPurAv/7rv/KjH/2Izs5OzjjjDG699Vai0ShlZWV8/vOf5/e//z0VFRXcd999PP7449TV1fGpT32K4uJinn76aQB+/OMf89BDD9HV1cXPf/5zli5d2q8Mzz33HHv37mXVqlXU1dVl86sdUCY1ki4zuwz4DPAf4TyNbyUiE9r27du55pprePHFF3n11Ve55557eOKJJ7j55pv5u7/7O5YuXcqGDRvYvHkzN954I3/9138NBOGyfft2HnzwQa644gp+8pOfpA0RgG9961ucffbZbN68mdWrV7Nz504Atm3bxv3338+TTz7Jli1biEajveHV0tLCKaecwvPPP8/73/9+vvWtb/Hxj3+c2tpa7r77brZs2UJxcTEAVVVVPP/883zxi1/k5ptvBqCuro4rrwxGjorH43z1q1/l+9//fk5/l5nUSK4AvgB8x93fNLPFwL/mtFQiMiUMVXPIpcWLF7N8+XIA3vWud3HeeedhZixfvpz6+noOHTrEZz7zGV5//XXMjK6uLgAikQjr1q1jxYoVfP7zn+ess84a8BgbNmzgF7/4BQAXX3wxFRUVAPzud7/jueee47TTTgOgra2N2bNn9+7/0kuDcWovv/xyPvaxjw24/55lp556au9xamtruf322wG49dZbueiii1i4cOGA+xgJQwaJu28FrgYwswqg3N2/l9NSiYjkWGFhYe/7SCTSOx2JRIjFYnzjG9/g3HPP5cEHH6S+vp5zzjmnd/3XX3+dsrKyjPos0l1a6+585jOf4bvf/e6wtk89h2g0SiyWOvgHPP3002zcuJFbb72Vo0eP0tnZSVlZGd/73sh+hGdy1dZ/mtk0M5tJMAbWnWb2gxEthYjIOHPo0CHmzw+GB1y3bl3S/GuuuYYNGzbQ3NzMAw88MOA+3ve+9/U2Wf3qV7/iwIEDAJx33nk88MADvP322wDs37+fHTt2AEFzVM8+77nnHs4++2wAysvLOXLkyDGdw913383OnTupr6/n5ptv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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x24600475fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))\n",
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_2.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth),len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth),len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'min_child_weight' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'max_depth_vs_min_child_weght2.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "经过这一轮调整，可以得到 max_depth=5. min_child_weight=1"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
